/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.intrace.visualvm.impl;
import com.sun.tools.attach.VirtualMachine;
import com.sun.tools.visualvm.application.Application;
import com.sun.tools.visualvm.application.jvm.Jvm;
import com.sun.tools.visualvm.application.jvm.JvmFactory;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.intrace.visualvm.Locator;
import org.openide.util.Exceptions;
/**
*
* @author mch50
*/
public class InTraceLoader {
public static interface StatusHandler {
public void handleStatus(String statusLine);
}
public static void loadAgent(Application app, StatusHandler handler) {
Jvm jvm = JvmFactory.getJVMFor(app);
if (app.isLocalApplication() && jvm.isAttachable() && jvm.isGetSystemPropertiesSupported()) {
try {
VirtualMachine vm = VirtualMachine.attach(String.valueOf(app.getPid()));
handler.handleStatus("Attached to JVM (PID: " + app.getPid() + ")");
vm.loadAgent(Locator.agentPath, "");
handler.handleStatus("InTrace Agent loaded");
} catch (Exception ex) {
handler.handleStatus("Exception thrown:\n" + throwableToString(ex));
Exceptions.printStackTrace(ex);
}
}
}
public static void launchClient(final StatusHandler handler) {
Runnable launchClientThread = new Runnable() {
@Override
public void run() {
try {
List<String> command = new ArrayList<String>();
command.add("java");
command.add("-jar");
command.add(Locator.clientPath);
ProcessBuilder builder = new ProcessBuilder(command);
System.out.println("Directory : " + System.getenv("temp"));
builder.start();
handler.handleStatus("InTrace Client launched");
} catch (Exception ex) {
handler.handleStatus("Exception thrown:\n" + throwableToString(ex));
Exceptions.printStackTrace(ex);
}
}
};
new Thread(launchClientThread).start();
}
private static String throwableToString(Throwable throwable) {
StringBuilder throwToStr = new StringBuilder();
if (throwable == null) {
throwToStr.append("null");
} else {
StringWriter strWriter = new StringWriter();
PrintWriter writer = new PrintWriter(strWriter);
throwable.printStackTrace(writer);
throwToStr.append(strWriter.toString());
}
return throwToStr.toString();
}
}